using System;

namespace Gl.SettingsManager
{
	internal class NumericValidator<T>
		where T : struct, IComparable
	{
		private bool _maxValueSet = false;
		private bool _minValueSet = false;

		private T _maxValue;
		private T _minValue;

		private NumericValidator() { }

		public static NumericValidator<T> GetMaxValidator(T maxValue)
		{
			NumericValidator<T> v = new NumericValidator<T>();
			v._maxValueSet = true;
			v._maxValue = maxValue;
			return v;
		}

		public static NumericValidator<T> GetMinValidator(T minValue)
		{
			NumericValidator<T> v = new NumericValidator<T>();
			v._minValue = minValue;
			v._minValueSet = true;
			return v;
		}

		public static NumericValidator<T> GetValidator(T minValue, T maxValue)
		{
			NumericValidator<T> v = new NumericValidator<T>();
			v._maxValue = maxValue;
			v._minValue = minValue;

			v._maxValueSet = true;
			v._minValueSet = true;
			return v;
		}

		public bool Validate(T value)
		{
			if (_maxValueSet)
				if (value.CompareTo(_maxValue) == 1)
					return false;

			if (_minValueSet)
				if (value.CompareTo(_minValue) == -1)
					return false;

			return true;
		}
	}
}
